package com.sunducation.wts.livedata

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders

//不用手动控制生命周期，不用担心内存泄露，数据变化时会收到通知

/*
LiveData 是一个可以被观察的数据持有类，它可以感知 Activity、Fragment或Service 等组件的生命周期。
简单来说，他主要有一下优点。

它可以做到在组件处于激活状态的时候才会回调相应的方法，从而刷新相应的 UI。
不用担心发生内存泄漏
当 config 导致 activity 重新创建的时候，不需要手动取处理数据的储存和恢复。它已经帮我们封装好了。
当 Actiivty 不是处于激活状态的时候，如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法，
而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法，
你可以使用 observeForever 方法，但是你必须在 onDestroy 的时候 removeObserver。
回想一下，在你的项目中，是不是经常会碰到这样的问题，当网络请求结果回来的时候，
你经常需要判断 Activity 或者 Fragment 是否已经 Destroy， 如果不是 destroy，才更新 UI。

而当你如果使用 Livedata 的话，因为它是在 Activity 处于 onStart 或者 onResume 的状态时，
他才会进行相应的回调，因而可以很好得处理这个问题，不必写一大堆的 activity.isDestroyed()

* **/


/*
一 使用LiveData的优点
使用LiveData具有以下优势：

1.确保您的UI符合您的数据状态

LiveData遵循观察者模式。Observer生命周期状态更改时，LiveData会通知对象。您可以合代码以更新这些Observer对象中的UI。每次应用程序数据更改时，您的观察者都可以在每次更改时更新UI，而不是更新UI。

2.没有内存泄漏

观察者绑定Lifecycle对象并在其相关生命周期被破坏后自行清理。

3.由于停止活动而没有崩溃

如果观察者的生命周期处于非活动状态（例如，在后端堆栈中的活动的情况下），则它不会接收任何LiveData事件。

4.不再需要手动生命周期处理

UI组件只是观察相关数据，不会停止或恢复观察。

LiveData自动管理所有这些，因为它在观察时意识到相关的生命周期状态变化。

5.始终保持最新数据

如果生命周期变为非活动状态，则会在再次变为活动状态时接收最新数据。

例如，后台活动在返回前台后立即收到最新数据。

6.适当的配置更改

如果由于配置更改（例如设备轮换）而重新创建活动或片段，则会立即接收最新的可用数据。

7.共享资源

您可以LiveData使用单例模式扩展对象以包装系统服务，以便可以在应用程序中共享它们。

该LiveData对象连接到系统服务一次，然后任何需要该资源的观察者只能观察该LiveData对象
*
**/
class MainActivity : AppCompatActivity() {

    private lateinit var mModel: LiveDataTimerViewModel
    private lateinit var mTextView: TextView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initViews()
        mModel = ViewModelProvider(this).get(LiveDataTimerViewModel::class.java)
        subscribe();
        mModel.LiveDataTimerViewModel();
    }

    private fun subscribe() {
        //observeForever  //界面销毁，不会自动回收，会造成内存泄漏
        //observe //界面销毁，会自动回收，不会内存泄漏
        mModel.getElapsedTime().observe(this, object: Observer<Long>{
            override fun onChanged(t: Long?) {
                mTextView.setText("time = " + t);
            }

        });
    }

    private fun initViews() {
        mTextView = findViewById(R.id.text_view);
    }
}
